#include<stdio.h>
#include<sys/wait.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>
int main()
{
  pid_t id=fork();
  if(id==0)
  {
    printf("I am a child  process... \n");
    sleep(3);
    //execl("/usr/bin/ls","ls","-a","-i","-l",NULL);
    //execl("/usr/bin/top","top",NULL);
    //execlp("ls","-a","-i","-l",NULL); //会自动搜索环境变量PATH
    char* myargv[]={
      "ls",
      "-a",
      "-i",
      "-l",
      NULL
    }; 
     // execv("/usr/bin/ls",myargv);//以数组的形式进行命令行参数传递
     //execvp("ls",myargv);
    char* myenv[]={
      "MYENV=you can see me!!!!!!!!!",
      NULL
    };
    execle("./cmd","cmd",NULL,myenv);//导入环境变量，覆盖式的导入 
    exit(111); //这句不会被执行，execl调用成功之后，永不返回，本进程代码被完全替换。
  }
  else 
  {
    int status=0;
    pid_t ret=waitpid(id,&status,0);
    if(ret>0)
    {
      printf("exit code: %d \n",(status>>8)&0xFF);
      printf("signal: %d \n",status&0x7F);
    }
  }
//  pid_t id=fork();
//  if(id==0)
//  {
//    int count=3;
//    while(count>0)
//    {
//      printf("I am child... pid:%d  ppid:%d \n",getpid(),getppid());
//      sleep(3);
//      count--;
//    }
//    exit(1);
//  }
//  else 
//  {
//    //基于非阻塞接口的轮询等待方案
//    while(1)
//    {
//     int status=0;
//     //pid_t ret=waitpid(id,&status,0);//阻塞等待
//     pid_t ret=waitpid(id,&status,WNOHANG);//非阻塞等待 
//     if(ret>0)
//      {
//       printf("wait success...   %d ret\n",ret);
//       if(WIFEXITED(status))
//        {
//          printf("exit code :%d\n",WEXITSTATUS(status));
//        }
//       break;
//      }
//     else if(ret==0) 
//     {
//       printf("I am father...\n");
//       sleep(1);
//     }
//     else
//     {
//       printf("wait error...\n");
//       break;
//     }
//   }
//  }
  return 0; 
}
